home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s_tool
/
loadsave.c
< prev
next >
Wrap
Text File
|
1999-06-11
|
29KB
|
1,411 lines
#include "JX250.H"
#include <sys\iocs.h>
#include <sys\dos.h>
#include <sys\scsi.h>
#include <stdio.h>
#include <stdlib.h>
#include <_tnb.c>
// 1 なら JPEGED も使用
#define JPEGED_ 1
/*------------------------------------------
* APICG Information
*/
struct APICGINFO {
long STARTX;
long STARTY;
long SIZEX;
long SIZEY;
long COLOR;
};
struct BMPHED {
UNchar f_type[2]; // ファイル識別子 'BM'
int f_size; // ファイルのサイズ
short f_reserved1; // 予備1
short f_reserved2; // 予備2
int f_offbits; // ファイル先頭からイメージデータへのオフセット
//--
int win3_size; // これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
int win3_width; // 横サイズ
int win3_height; // 縦サイズ
short win3_planes; // 使用プレーン数
short win3_bitcount; // 色数 (1:2色,4:16色,8:256色,24:16777216色)
int win3_comp; // 圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
int win3_size_image;// イメージデータのサイズ
int win3_xpels_pm; // X方向のディスプレイ分解能
int win3_ypels_pm; // Y方向のディスプレイ分解能
int win3_clr_used; // 色変換テーブルの大きさ
int win3_clr_imp; // 重要な色の数
};
/* Load from File */
long PICLOAD_( UWORD *, char *, long, long, UBYTE *, long, ULONG );
long APICLOAD( UWORD *, char *, long, long, UBYTE *, long, ULONG, UBYTE * );
long JPGLOAD( UWORD *, char *, long, long, UBYTE *, long, ULONG, long );
/* Save to File */
long PICSAVE_( UWORD *, char *, long, long, long, long, UBYTE *, UBYTE *, long, ULONG );
long APICSAVE( UWORD *, char *, long, long, long, long, UBYTE *, UBYTE *, long, ULONG, UBYTE * );
static int SavSX,SavSY;
static int SavLX,SavLY;
/**************************************************
画像セーブ
***************************************************/
int SaveGraphic()
{
int r,f;
if ( ScanData==0 ){
Dialog("","画像がありません","",1);
return(1);
}
if ( Afile[0]==0 ){
Dialog("","ファイル名を指定して下さい","",1);
return(1);
}
if ( RecX2<=0 || RecY2<=0 ){
SavSX=0;
SavSY=0;
SavLX=ScanDataX;
SavLY=ScanDataY;
} else {
SavSX=RecX1;
SavSY=RecY1;
SavLX=(RecX2-RecX1)+1;
SavLY=(RecY2-RecY1)+1;
}
if ( Dialog("","セーブします","",2)!=0 ){
return(1);
}
f=NewFileCreate();
if ( f<0 )
return(f);
Dialog("",""," セーブ中",0);
MsPat(-1);
switch(RecSavMode){
case(1):
//------- PIC
r=PICSave(f);
break;
case(0):
//------- CUT
r=CUTSave(f);
break;
case(3):
//------- BMP
r=BMPSave(f,Afile);
//r=IPXSave(f);
break;
case(5):
//------- RGB
r=RGBSave(f,Afile);
break;
case(2):
//------- GLM
r=GLMSave(f,Afile);
//r=PIC2Save(f);
break;
case(4):
//------- JEPG
r=JPEGSave(f,Afile);
break;
}
MsPat(0);
Dialog(0,0,0,-1);
_dos_close(f);
if ( r!=0 ) // エラーなので
_dos_delete(Afile);
if ( r>0x6800 )
Dialog(0,(void*)r,0,1);
if ( r<0 ){
UNchar buf[32];
sprintf(buf,"ERR CODE = %d",r);
Dialog("エラーが発生しました",buf,0,1);
}
if ( r==0 ){
Dialog(0,"セーブ終了しました",0,1);
FileSearch(0);
ViewFiles(-1);
ViewFiles(ViewFileY);
}
return(r);
}
/**************************************************
画像ロード
***************************************************/
int LoadGraphic()
{
int r,f;
if ( Afile[0]==0 ){
Dialog(0,"ファイル名を指定して下さい",0,1);
return(1);
}
if ( Dialog("","ロードします","",2)!=0 ){
return(1);
}
if ( DrvAccess(0,Afile)!=0 ){
Dialog("","ドライブが用意でいていません","ロードを中止します",1);
return(1);
}
f=_dos_open(Afile,0);
if ( f<0 ){
Dialog("","ファイルがオープン出来ません","ロードを中止します",1);
return(1);
}
if ( ScanData>99 ){
_dos_mfree(ScanData);
ScanData=0;
}
Dialog("",""," ロード中",0);
MsPat(-1);
r=0;
switch(RecSavMode){
case(1):
//------- PIC
r=PICLoad(f);
break;
case(0):
//------- CUT
r=CUTLoad(f);
break;
case(3):
//------- BMP
r=BMPLoad(f);
//r=IPXLoad(f);
break;
case(5):
//------- RGB
r=RGBLoad(f,Afile);
break;
case(2):
//------- GLM
r=GLMLoad(f);
//r=PIC2Load(f);
break;
case(4):
//------- JEPG
r=JPEGLoad(f,Afile);
break;
}
MsPat(0);
Dialog(0,0,0,-1);
_dos_close(f);
if ( r!=0 ){ // エラーなので
if ( ScanData>99 ){
_dos_mfree(ScanData);
ScanData=0;
}
ScanGraphView(0,0,0);
}
if ( r>0x6800 )
Dialog(0,(void*)r,0,1);
if ( r<0 ){
UNchar buf[32];
sprintf(buf,"ERR CODE = %d",r);
Dialog("エラーが発生しました",buf,0,1);
}
if ( r==0 ){
MakeGammaTable(DataMd);
ScanGraphView(0,0,0);
Dialog(0,"ロード終了しました",0,1);
VewPX=0;
VewPY=0;
RecPX=0;
RecPY=0;
RecX1=0;
RecY1=0;
RecX2=ScanDataX-1;
RecY2=ScanDataY-1;
Rec_PosSetDraw(RecX1,RecY1,RecX2,RecY2);
}
return(r);
}
/*------------------------------------------------------------------*/
/*******************************************
カットファイル (OK)
[.CUT]
[戻り値] 0=正常終了
********************************************/
int CUTSave(f)
int f;
{
#define BUF_X 128
int x,y,size;
int spp;
UNshort w;
UNchar *G,*M;
UNshort *P;
short dx,dy;
UNchar cond1[256],cond2[256];
UNchar buf[16000];
G=ScanData;
dx=SavLX;
dy=SavLY;
sprintf( buf, "%-8s(%.4d,%.4d)%-26s\r\n\x1A", "CUT_V1.0", dx, dy, "JX250" );
__fwrite(f,buf,48);
w=dx;
__fwrite(f,&w,2);
w=dy;
__fwrite(f,&w,2);
M=buf;
y=0;
size=(((dx-1)>>3)+1);
condence2(cond1,0,cond2); ///初期化
for(;dy;dy--){
for(x=0;x<SavLX;x+=8)
M[x/8]=0;
if ( DataC==0 ){
//-- 64k
for(x=0;x<SavLX;x++){
if ( GG(G[(SavSX+x)*2+(SavSY+y)*DataX*2]*0x100)>16 )
M[x/8]|=bit(7-(x&7));
}
} else {
//-- 24bit
if ( DataMd==5 ){
// カラー
for(x=0;x<SavLX;x++){
if ( G[(SavSX+x)*3+(SavSY+y)*DataX*3]>128 )
M[x/8]|=bit(7-(x&7));
}
} else {
// モノ
for(x=0;x<SavLX;x++){
if ( G[(SavSX+x)+(SavSY+y)*DataX]>128 )
M[x/8]|=bit(7-(x&7));
}
}
}
dx=condence2(M,size,cond2);
dx=condence1(cond2,dx,cond1);
__fwrite(f,cond1,dx);
y++;
}
return(0);
}
/*++++++++++++++++++++++*/
static int condence1( org,count,cond )
UNchar *org;
int count;
UNchar *cond;
{
int pt, bt, flag, hflag=0;
UNchar *head, *body;
pt=( (count-1)>>3 )+1;
body=( head=cond+1 )+pt;
for(;pt!=0;pt--){
flag=0;
for( bt=8;bt!=0;bt--){
flag<<=1;
if ( *org ){
*body++ = *org;
flag|=1;
}
org++;
}
*head++=flag;
hflag|=(flag!=0);
}
if ( hflag )
*cond=body-cond;
else *cond=1;
return( *cond );
}
/*+++++++++++++++*/
static int condence2( org,count,cond )
UNchar *org;
int count;
UNchar *cond;
{
static UNchar orgBuf[128];
int c;
UNchar *buf;
buf=orgBuf;
if ( count==0 ){
for(c=0;c<BUF_X;c++)
*buf++=0;
} else {
for(c=0;c<count;c++){
*cond++=*org^*buf;
*buf++=*org++;
}
}
return( count );
}
/*****************************************
拡張Image Photoファイル (OK)
[.IPX]
<format>
.dc.b xL,xH,yL,yH
.dcb.b x*y
[戻り値] 0=正常終了
******************************************/
int IPXSave(f)
int f;
{
int x,y,yy;
UNshort w;
UNchar buf[16000];
w=(SavLX/0x100)|((SavLX*0x100)&0xFF00);
__fwrite(f,&w,2);
w=(SavLY/0x100)|((SavLY*0x100)&0xFF00);
__fwrite(f,&w,2);
for(y=0;y<SavLY;y++){
if ( DataC==0 ){
// 64k
yy=(y+SavSY)*DataX;
for(x=0;x<SavLX;x++)
buf[x]=ScanData[(yy+(x+SavSX))*2]&0xF8;
} else {
// 24bit
if ( DataMd==5 ){
// カラー
yy=(y+SavSY)*DataX*3;
for(x=0;x<SavLX;x++)
buf[x]=ScanData[yy+(x+SavSX)*3+1];
} else {
// モノクロ
yy=(y+SavSY)*DataX;
for(x=0;x<SavLX;x++)
buf[x]=ScanData[yy+(x+SavSX)];
}
}
__fwrite(f,buf,ScanDataX);
}
return(0);
}
/*********************************
PIC セーブ (OK)
*********************************/
int PICSave(f)
int f;
{
int x,y,r,dx;
int fbuf[1024*2];
UNchar *N;
UNshort *M,*W;
_dos_close(f);
if ( DataC==0 ){
r=PICSAVE_( ScanData,Afile,
SavSX,SavSY,SavSX+SavLX-1,SavSY+SavLY-1,
"",fbuf,1024*2*4,bit(15)
);
return(r);
}
//--- 24bit カラー
W=_dos_malloc( SavLX*SavLY*2 );
if ( W>=0x81000000 ){
return("メモリが足りません");
}
M=W;
//-- 64k に変換
if ( DataMd==5 ){
// カラー
for(y=0;y<SavLY;y++){
N=&ScanData[ ((SavSX)+(y+SavSY)*DataX)*3 ];
for(x=0;x<SavLX;x++,N+=3){
*M++=RGB(N[0]/8,N[1]/8,N[2]/8);
}
}
} else {
for(y=0;y<SavLY;y++){
N=&ScanData[ ((SavSX)+(y+SavSY)*DataX) ];
for(x=0;x<SavLX;x++,N++){
*M++=RGB(N[0]/8,N[0]/8,N[0]/8);
}
}
}
dx=DataX;
DataX=SavLX; // PICSAVE_ のため
r=PICSAVE_( W,Afile,
0,0,SavLX-1,SavLY-1,
"",fbuf,1024*2*4,bit(15)
);
DataX=dx;
_dos_mfree(W);
return(r);
}
/*********************************
PIC2 セーブ
*********************************/
int PIC2Save(f)
int f;
{
int o,r;
UNchar buf[256];
_dos_close(f);
o=RecVwBai;
RecVwBai=0;
ScanGraphView(0,0,1);
RecVwBai=o;
sprintf(buf,"pic2 -best -s%d,%d,%d,%d %s",SavSX,SavSY,SavSX+SavLX-1,SavSY+SavLY-1,Afile);
r=ChildDisp(buf);
return(r);
}
/*********************************
JPEG セーブ
*********************************/
int JPEGSave(f)
int f;
{
int r,fi;
UNchar tn[256];
UNchar *s,buf[256];
_dos_close(f);
if ( DataC==0 && JpegedUseMode==0 ){ // 0;64k の時使用する 1;使用しない
//64k
if ( AspMode==0 )
s="jpeged %s -s%d,%d,%d,%d -VS%d,%d,$%X %s";
else s="jpeged -a %s -s%d,%d,%d,%d -VS%d,%d,$%X %s";
sprintf(buf,s,
JpegSwc,
SavSX,SavSY,SavSX+SavLX-1,SavSY+SavLY-1,
DataX,ScanDataY,(int)ScanData,
Afile
);
r=ChildDisp(buf);
return(r);
}
//24bit
if ( *RGBtemp==0 ){
if ( _dos_getenv("jxtemp",0,tn)>=0 ){
;
} elif ( _dos_getenv("temp",0,tn)>=0 ){
;
} else {
struct _psp *pd = _dos_getpdb();
jstrcpy(tn,(char *)pd->exe_path);
}
} else jstrcpy(tn,RGBtemp);
jstrcat(tn,"$J25????.RGB");
fi=_dos_maketmp(tn,bit(5));
if ( fi<0 )
return(fi);
r=RGBSave(fi,tn);
if ( r==0 ){
_dos_close(fi);
sprintf(buf,"ej %s %s %s",Jpeg24Swc,tn,Afile);
r=ChildDisp(buf);
}
_dos_close(fi);
_dos_delete(tn);
strmfe(buf,tn,"IPR");
_dos_delete(buf);
return(r);
}
/*********************************
RGB セーブ
*********************************/
int RGBSave(f,fn)
int f;
UNchar *fn;
{
int i,fi,x,y;
UNchar buf[4096*3];
if ( DataC!=0 ){
// 24bit
if ( DataMd==5 ){
// カラー
for(y=0;y<SavLY;y++){
__fwrite(f,&ScanData[(SavSX)*3+(y+SavSY)*DataX*3],SavLX*3);
}
} else {
// モノ
for(y=0;y<SavLY;y++){
for(x=0;x<SavLX;x++){
i=ScanData[(x+SavSX)+(y+SavSY)*DataX];
buf[x*3+0]=i;
buf[x*3+1]=i;
buf[x*3+2]=i;
}
__fwrite(f,buf,SavLX*3);
}
}
} else {
// 64k
for(y=0;y<SavLY;y++){
for(x=0;x<SavLX;x++){
i=*(UNshort*)&ScanData[(x+SavSX)*2+(y+SavSY)*DataX*2];
buf[x*3+0]=RR(i)*8;
buf[x*3+1]=GG(i)*8;
buf[x*3+2]=BB(i)*8;
}
__fwrite(f,buf,SavLX*3);
}
}
strmfe(buf,fn,"IPR");
if ( DrvAccess(1,buf)!=0 ){
return("プロテクトされています");
}
fi=_dos_create(buf,bit(5));
if ( fi<0 )
return(fi);
sprintf(buf,"%d %d 0 0\x1A",SavLX,SavLY);
__fwrite(fi,buf,strlen(buf));
_dos_close(fi);
return(0);
}
/*********************************
BMP セーブ
*********************************/
int BMPSave(f,fn)
int f;
UNchar *fn;
{
int i,fi,x,y,xx,yy,lx;
UNchar *C;
UNchar buf[4096*3];
struct BMPHED bmphed;
//-- HED 制作
lx=(SavLX*3+3)&0xFFFC;
bmphed.f_type[0] = 'B';
bmphed.f_type[1] = 'M';
bmphed.f_size = l_mtoi(SavLY*lx+54); // ファイルのサイズ
bmphed.f_reserved1=0; // 予備1
bmphed.f_reserved2=0; // 予備2
bmphed.f_offbits= l_mtoi( 54 ); // ファイル先頭からイメージデータへのオフセット
bmphed.win3_size= l_mtoi( 40 ); // ヘッダサイズ(12:OS/2 V1, 40:Win3, 64:OS/2 V2)
//
bmphed.win3_width= l_mtoi(SavLX); // 横サイズ
bmphed.win3_height= l_mtoi(SavLY); // 縦サイズ
bmphed.win3_planes= w_mtoi( 1 ); // 使用プレーン数
bmphed.win3_bitcount= w_mtoi( 24 ); // ビット数
bmphed.win3_comp= l_mtoi( 0 ); // 圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
//
bmphed.win3_size_image= l_mtoi(SavLY*lx); // イメージデータのサイズ
bmphed.win3_xpels_pm = l_mtoi( 0xB13 ); //X方向のディスプレイ分解能
bmphed.win3_ypels_pm = l_mtoi( 0xB13 ); //Y方向のディスプレイ分解能
bmphed.win3_clr_used = 0; // 色変換テーブルの大きさ
bmphed.win3_clr_imp = 0; // 重要な色の数
//
__fwrite(f,&bmphed,54);
if ( DataC!=0 ){
// 24bit
if ( DataMd==5 ){
// カラー
//for(y=0;y<SavLY;y++){
for(y=SavLY-1;y>=0;y--){
for(x=0;x<SavLX;x++){
C=&ScanData[((x+SavSX)+(y+SavSY)*DataX)*3];
buf[x*3+0]=C[2];
buf[x*3+1]=C[1];
buf[x*3+2]=C[0];
}
__fwrite(f,buf,lx);
}
} else {
// モノ
//for(y=0;y<SavLY;y++){
for(y=SavLY-1;y>=0;y--){
for(x=0;x<SavLX;x++){
i=ScanData[(x+SavSX)+(y+SavSY)*DataX];
buf[x*3+0]=i;
buf[x*3+1]=i;
buf[x*3+2]=i;
}
__fwrite(f,buf,lx);
}
}
} else {
// 64k
//for(y=0;y<SavLY;y++){
for(y=SavLY-1;y>=0;y--){
for(x=0;x<SavLX;x++){
i=*(UNshort*)&ScanData[(x+SavSX)*2+(y+SavSY)*DataX*2];
buf[x*3+0]=BB(i)*8;
buf[x*3+1]=GG(i)*8;
buf[x*3+2]=RR(i)*8;
}
__fwrite(f,buf,lx);
}
}
return(0);
}
/*********************************
GLM セーブ
*********************************/
int GLMSave(f,fn)
int f;
UNchar *fn;
{
int i,r,g,b,x,y;
UNchar buf[4096*3];
static UNchar hed[]={
0x47,0x52,0x36,0x35,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x02,0x00,0x02,0x00
};
i=SavLX*SavLY*2 +8;
*(int*)&hed[4]=i;
hed[12]=SavLX/0x100;
hed[13]=SavLX&0xFF;
hed[14]=SavLY/0x100;
hed[15]=SavLY&0xFF;
__fwrite(f,hed,16);
if ( DataC!=0 ){
// 24bit
if ( DataMd==5 ){
// カラー
for(y=0;y<SavLY;y++){
for(x=0;x<SavLX;x++){
r=ScanData[(x+SavSX)*3+(y+SavSY)*DataX*3];
g=ScanData[(x+SavSX)*3+(y+SavSY)*DataX*3+1];
b=ScanData[(x+SavSX)*3+(y+SavSY)*DataX*3+2];
i=RGB(r/8,g/8,b/8);
buf[x*2+0]=i/0x100;
buf[x*2+1]=i&0xFF;
}
__fwrite(f,buf,SavLX*2);
}
} else {
// モノ
for(y=0;y<SavLY;y++){
for(x=0;x<SavLX;x++){
i=ScanData[(x+SavSX)+(y+SavSY)*DataX];
i/=8;
i=RGB(i,i,i);
buf[x*2+0]=i/0x100;
buf[x*2+1]=i&0xFF;
}
__fwrite(f,buf,SavLX*2);
}
}
} else {
// 64k
for(y=0;y<SavLY;y++)
__fwrite(f,&ScanData[(SavSX)*2+(y+SavSY)*DataX*2],SavLX*2);
}
return(0);
}
/*------------------------------------------------------------------*/
/**************************************
CUT ロード
**************************************/
char *CUTLoad(f)
int f;
{
int i,x,y,dx,dy,x_,xx,yy;
int size;
short w;
UNchar cond1[256],cond2[256];
UNchar buf[256];
UNchar *M;
__fread(f,buf,48);
if( strncmp(buf,"CUT_V",5)!=0 )
return("CUT FILEではありません");
__fread(f,&w,2);
xx=dx=w;
__fread(f,&w,2);
yy=dy=w;
x_=(dx+7)&0xFFF8;
if ( x_<512 )
x_=512;
if ( mat_vadds==0 ){
if ( FullColor==0 )
M=_dos_malloc(x_*yy*2);
elif ( ImageMode==0 ) // 0;カラー 1;白黒
M=_dos_malloc(x_*yy*3);
else M=_dos_malloc(x_*yy);
if ( M>=0x81000000 ){
return("メモリが足りませんでした");
//return(-1);
}
} else {
if ( xx>mat_xwidth || yy>mat_ywidth ){
return("仮想画面SIZE OVER です。");
}
M=mat_vadds;
x_ = mat_xwidth;
FullColor=0;
}
ScanData=M;
expand2( buf, 0, cond2 );
size = ((dx-1)>>3)+1;
y = 0;
for(;dy;dy--){
__fread(f,cond1,1);
__fread(f,cond1+1,*cond1-1);
expand1( cond2,size,cond1 );
expand2( buf,size,cond2 );
for(x=0;x<dx;x++){
i=(buf[(x/8)]&bit(7-(x&7)))?65535:0;
if ( FullColor==0 ){
*(UNshort*)&M[(x+y*x_)*2]=i;
} elif ( ImageMode==0 ){ // 0;カラー 1;白黒
M[(x+y*x_)*3+0]=i;
M[(x+y*x_)*3+1]=i; // 255 になるから問題無し
M[(x+y*x_)*3+2]=i;
} else {
M[(x+y*x_)]=i;
}
}
y++;
}
ScanDataX=xx;
ScanDataY=yy;
DataX=x_;
if ( FullColor!=0 ){
if ( ImageMode==0 )
DataMd=5;
else DataMd=2;
}
DataC=FullColor;
return(0);
}
/*+++++++++++++++*/
static void expand1( org,count,cond )
UNchar *org;
int count;
UNchar *cond;
{
int pt, bt, flag;
UNchar *head, *body;
if ( *cond==1 ) {
for(pt=0;pt<count;pt++ )
*org++=0;
return;
}
pt = ( (count-1)>>3 )+1;
body = (head=cond+1)+pt;
for(;pt;pt--){
flag = *head++;
for(bt=8;bt;bt--){
if ( flag&0x80 )
*org=*body++;
else *org=0;
org++;
flag<<=1;
}
}
}
/*++++++++++++++++++++++++++++*/
static void expand2( org,count,cond )
UNchar *org;
int count;
UNchar *cond;
{
static UNchar orgBuf[256];
int c;
UNchar *buf;
buf = orgBuf;
if ( count==0 ){
for(c=0;c<BUF_X;c++)
*buf++ = 0;
} else {
for(c=0;c<count;c++) {
*org = *cond++ ^ *buf;
*buf++ = *org++;
}
}
}
/*********************************
IPX ロード
*********************************/
char *IPXLoad(f)
int f;
{
int i,x,xx,y,yy,x_;
UNshort w;
UNchar *M;
UNchar buf[16000];
__fread(f,&w,2);
ScanDataX=(w/0x100)|((w*0x100)&0xFF00);
__fread(f,&w,2);
ScanDataY=(w/0x100)|((w*0x100)&0xFF00);
x_=(xx+7)&0xFFF8;
if ( x_<512 )
x_=512;
if ( mat_vadds==0 ){
if ( FullColor==0 )
M=_dos_malloc(x_*ScanDataY*2);
elif ( ImageMode==0 ) // 0;カラー 1;白黒
M=_dos_malloc(x_*ScanDataY*3);
else M=_dos_malloc(x_*ScanDataY);
if ( M>=0x81000000 ){
return("メモリが足りませんでした");
}
} else {
if ( xx>mat_xwidth || yy>mat_ywidth ){
return("仮想画面SIZE OVER です。");
}
M=mat_vadds;
x_ = mat_xwidth;
FullColor=0;
}
ScanData=M;
for(y=0;y<ScanDataY;y++){
__fread(f,buf,ScanDataX);
if ( FullColor==0 ){
// 64k
yy=(y)*x_*2;
for(x=0;x<ScanDataX;x++){
i=buf[x]/8;
*(UNshort*)&ScanData[yy+x*2]=RGB(i,i,i);
}
} else {
// 24bit
if ( ImageMode==0 ){
// カラー
yy=(y)*x_*3;
for(x=0;x<ScanDataX;x++){
i=buf[x];
ScanData[yy+x*3+0]=i;
ScanData[yy+x*3+1]=i;
ScanData[yy+x*3+2]=i;
}
} else {
// モノクロ
yy=(y)*x_;
for(x=0;x<ScanDataX;x++){
ScanData[yy+x]=buf[x];
}
}
}
}
if ( FullColor!=0 ){
if ( ImageMode==0 )
DataMd=5;
else DataMd=2;
}
DataC=FullColor;
DataX=x_;
return(0);
}
/*********************************
PIC ロード
*********************************/
int PICLoad(f)
int f;
{
int xx,yy,x_,r;
int fbuf[1024*2];
UNchar *M;
_dos_close(f);
// 大きさを得る
r=PICLOAD_( fbuf,Afile,0,0,fbuf,1024*2*4,bit(0)|bit(1)|bit(2)|bit(3)|bit(4)|bit(15)|bit(31) );
if ( r!=0 )
return(r);
xx=fbuf[2];
yy=fbuf[3];
//printf("pic サイズ=%d,%d",xx,yy);
x_=(xx+7)&0xFFF8;
if ( x_<512 )
x_=512;
if ( mat_vadds==0 ){
M=_dos_malloc(x_*yy*2);
if ( M>=0x81000000 ){
return("メモリが足りませんでした");
//return(-1);
}
} else {
if ( xx>mat_xwidth || yy>mat_ywidth ){
return("仮想画面SIZE OVER です。");
}
M=mat_vadds;
x_ = mat_xwidth;
}
ScanData=M;
DataX=x_;
r=PICLOAD_( M,Afile,0,0,fbuf,1024*2*4,bit(0)|bit(2)|bit(3)|bit(4)|bit(15) );
if ( r!=0 )
return(r);
ScanDataX=xx;
ScanDataY=yy;
FullColor=0;
DataC=0;
return(0);
}
/*********************************
PIC2 ロード
*********************************/
int PIC2Load(f)
int f;
{
int i,o,r,ssp;
UNchar buf[256];
UNshort *M,*N;
_dos_close(f);
if ( mat_vadds==0 ){
M=_dos_malloc(512*512*2);
if ( M>=0x81000000 ){
return("メモリが足りませんでした");
//return(-1);
}
} else {
Dialog("マチエールの仮想画面","では pic2 ロード出来ません","",1);
return(-1);
}
ScanData=M;
sprintf(buf,"pic2 %s",Afile);
//printf("child = %s ",buf);
o=_iocs_b_wpeek(0xE82600);
_iocs_b_wpoke(0xE82600,0x193F);
_iocs_tgusemd(0,0);
_iocs_tgusemd(1,1);
_iocs_g_clr_on();
cls();
printf("\n\n\n");
_iocs_tpalet(3,RGB(31,31,31));
r=CHILD(buf);
//printf("(r=%d",r);
_iocs_tgusemd(0,2);
_iocs_tgusemd(1,2);
if ( r<0 )
return(r);
ssp=_iocs_b_super(0);
N=0xC00000;
for(i=0;i<512*512;i++)
*M++=*N++;
if ( ssp>0 )
_iocs_b_super(ssp);
_iocs_b_wpoke(0xE82600,o);
ScanDataX=512;
ScanDataY=512;
DataX=512;
FullColor=0;
DataC=0;
_iocs_tpalet(0,0);
for(i=1;i<4;i++)
_iocs_tpalet(i,RGB(i*10+1,i*10+1,i*10+1) );
_iocs_tpalet(4,RGB(15,15,15));
_iocs_tpalet(8,RGB(31,31,31));
_dos_c_curoff();
RecodeModeDraw();
return(0);
}
/*********************************
RGB ロード
*********************************/
int RGBLoad(f,fn)
int f;
UNchar *fn;
{
int i,j,fi,x,y,xx,yy,x_,ii,d;
UNchar buf[4096*3];
UNchar dummy[256];
UNchar *M;
ii=0;
strmfe(buf,fn,"IPR");
if ( DrvAccess(0,buf)!=0 ){
return("ドライブが用意でいていません");
}
fi=_dos_open(buf,0);
if ( fi>=0 ){
i=_dos_read(fi,buf,64);
if ( i>=0 ){
_dos_close(fi);
if ( sscanf(buf,"%d %d 0 0",&xx,&yy)==2 )
ii=-1;
}
}
if ( ii==0 ){
strmfe(buf,fn,"FAL");
if ( DrvAccess(0,buf)!=0 ){
return("ドライブが用意でいていません");
}
fi=_dos_open(buf,0);
if ( fi<0 )
return(fi);
i=_dos_read(fi,buf,64);
if ( i<0 )
return(i);
_dos_close(fi);
if ( sscanf(buf,"%s\n %d %d 0 0",dummy,&xx,&yy)==3 )
ii=-1;
}
if ( ii==0 ){
return("RGB ファイル じゃないようです");
}
x_=(xx+7)&0xFFF8;
if ( x_<512 )
x_=512;
if ( mat_vadds==0 ){
if ( FullColor!=0 ){
if ( ImageMode==0 )
M=_dos_malloc(x_*yy*3);
else M=_dos_malloc(x_*yy);
} else {
M=_dos_malloc(x_*yy*2);
}
if ( M>=0x81000000 ){
return("メモリが足りませんでした");
//return(-1);
}
} else {
if ( xx>mat_xwidth || yy>mat_ywidth ){
return("仮想画面SIZE OVER です。");
}
M=mat_vadds;
x_ = mat_xwidth;
FullColor=0;
}
ScanData=M;
if ( FullColor!=0 ){
// 24bit
if ( ImageMode==0 ){
// カラー
for(y=0;y<yy;y++){
__fread(f,&ScanData[(y)*x_*3],xx*3);
}
DataMd=5;
} else {
// モノ
for(y=0;y<yy;y++){
__fread(f,buf,xx*3);
for(x=0;x<xx;x++){
ScanData[(x)+(y)*x_]=buf[x*3+1];
}
}
DataMd=2;
}
} else {
// 64k
extern UNshort RG0[256],RG1[256];
extern UNshort GG0[256],GG1[256];
extern UNshort BG0[256],BG1[256];
MakeGammaTable(0);
for(y=0;y<yy;y++){
__fread(f,buf,xx*3);
j=y&1;
for(x=0;x<xx;x++,j^=1){
if ( j==0 )
d=RG0[buf[x*3+0]]+GG0[buf[x*3+1]]+BG0[buf[x*3+2]];
else d=RG1[buf[x*3+0]]+GG1[buf[x*3+1]]+BG1[buf[x*3+2]];
*(UNshort*)&ScanData[(x)*2+(y)*x_*2]=d;
}
}
}
ScanDataX=xx;
ScanDataY=yy;
DataX=x_;
DataC=FullColor;
return(0);
}
/*********************************
BMP ロード
*********************************/
int BMPLoad(f,fn)
int f;
UNchar *fn;
{
int i,j,fi,x,y,xx,yy,x_,ii,d,l,ll,xxx;
UNchar buf[4096*3];
UNchar dummy[256];
UNchar *M;
struct BMPHED bmphed;
//---- HED 解析
__fread(f,&bmphed,54);
if ( bmphed.f_type[0]!='B' || bmphed.f_type[1]!='M' ){
return("BMP ファイルではないようです");
}
ll=l_mtoi( bmphed.f_offbits ); // ファイル先頭からイメージデータへのオフセット
/*
int f_offbits; // ファイル先頭からイメージデータへのオフセット
UNchar f_type[2]; // ファイル識別子 'BM'
int f_size; // ファイルのサイズ
short f_reserved1; // 予備1
short f_reserved2; // 予備2
int f_offbits; // ファイル先頭からイメージデータへのオフセット
//--
int win3_size; // これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
int win3_width; // 横サイズ
int win3_height; // 縦サイズ
short win3_planes; // 使用プレーン数
short win3_bitcount; // 色数 (1:2色,4:16色,8:256色,24:16777216色)
int win3_comp; // 圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
int win3_size_image;// イメージデータのサイズ
int win3_xpels_pm; // X方向のディスプレイ分解能
int win3_ypels_pm; // Y方向のディスプレイ分解能
int win3_clr_used; // 色変換テーブルの大きさ
int win3_clr_imp; // 重要な色の数
*/
xx=l_mtoi( bmphed.win3_width ); // 横サイズ
yy=l_mtoi( bmphed.win3_height ); // 縦サイズ
xxx=(xx*3+3)&0xFFFC; // データ上の幅サイズ
i=w_mtoi( bmphed.win3_bitcount );
if ( i!=24 && i!=8 ){
// 色数 (1:2色,4:16色,8:256色,24:16777216色)
return("カラービット数が対応外です");
}
/*
とりあえず、24bit のみ対応
*/
if ( i!=24 ){
// 色数 (1:2色,4:16色,8:256色,24:16777216色)
return("カラービット数が対応外です");
}
//--
x_=(xx+7)&0xFFF8;
if ( x_<512 )
x_=512;
if ( mat_vadds==0 ){
if ( FullColor!=0 ){
if ( ImageMode==0 )
M=_dos_malloc(x_*yy*3);
else M=_dos_malloc(x_*yy);
} else {
M=_dos_malloc(x_*yy*2);
}
if ( M>=0x81000000 ){
return("メモリが足りませんでした");
//return(-1);
}
} else {
if ( xx>mat_xwidth || yy>mat_ywidth ){
return("仮想画面SIZE OVER です。");
}
M=mat_vadds;
x_ = mat_xwidth;
FullColor=0;
}
ScanData=M;
if ( FullColor!=0 ){
// 24bit
if ( ImageMode==0 ){
// カラー
//for(y=0;y<yy;y++){
for(y=yy-1;y>=0;y--){
__fread(f,buf,xxx);
for(x=0;x<xx;x++){
ScanData[((x)+(y)*x_)*3+0]=buf[x*3+2];
ScanData[((x)+(y)*x_)*3+1]=buf[x*3+1];
ScanData[((x)+(y)*x_)*3+2]=buf[x*3+0];
}
}
DataMd=5;
} else {
// モノ
//for(y=0;y<yy;y++){
for(y=yy-1;y>=0;y--){
__fread(f,buf,xxx);
for(x=0;x<xx;x++){
ScanData[(x)+(y)*x_]=buf[x*3+1];
}
}
DataMd=2;
}
} else {
// 64k
extern UNshort RG0[256],RG1[256];
extern UNshort GG0[256],GG1[256];
extern UNshort BG0[256],BG1[256];
MakeGammaTable(0);
//for(y=0;y<yy;y++){
for(y=yy-1;y>=0;y--){
__fread(f,buf,xxx);
j=y&1;
for(x=0;x<xx;x++,j^=1){
if ( j==0 )
d=RG0[buf[x*3+2]]+GG0[buf[x*3+1]]+BG0[buf[x*3+0]];
else d=RG1[buf[x*3+2]]+GG1[buf[x*3+1]]+BG1[buf[x*3+0]];
*(UNshort*)&ScanData[(x)*2+(y)*x_*2]=d;
}
}
}
ScanDataX=xx;
ScanDataY=yy;
DataX=x_;
DataC=FullColor;
return(0);
}
/*********************************
JPEG ロード
*********************************/
int JPEGLoad(f)
int f;
{
int i,r,fi,xx,yy,x_,y_;
UNchar tn[256];
UNchar buf[256];
int fbuf[1024*2];
UNchar *M;
UNshort *N;
_dos_close(f);
if ( mat_vadds!=0 )
FullColor=0;
if ( FullColor==0 && JpegedUseMode==0 ){ // 0;64k の時使用する 1;使用しない
//64k
// 大きさを得る
r=JPGLOAD( fbuf,Afile,0,0,fbuf,1024*2*4,bit(0)|bit(1)|bit(2)|bit(3)|bit(4)|bit(15)|bit(31),100 );
if ( r!=0 )
return(r);
xx=fbuf[2];
yy=fbuf[3];
//printf("pic サイズ=%d,%d",xx,yy);
x_=xx;
y_=yy;
if ( mat_vadds==0 ){
M=_dos_malloc(x_*yy*2);
if ( M>=0x81000000 ){
return("メモリが足りませんでした");
//return(-1);
}
} else {
if ( xx>mat_xwidth || yy>mat_ywidth ){
return("仮想画面SIZE OVER です。");
}
M=mat_vadds;
x_ = mat_xwidth;
y_ = mat_ywidth;
}
ScanData=M;
sprintf(buf,"jpeged -L0,0 -VS%d,%d,$%X %s",
x_,y_,M,
Afile
);
r=ChildDisp(buf);
ScanDataX=xx;
ScanDataY=yy;
DataX=x_;
FullColor=0;
DataC=0;
//- 輝度ビット寝かす
N=ScanData;
for(i=x_*yy;i>0;i--)
*N++&=0xFFFE;
return(r);
}
if ( *RGBtemp==0 ){
if ( _dos_getenv("jxtemp",0,tn)>=0 ){
;
} elif ( _dos_getenv("temp",0,tn)>=0 ){
;
} else {
struct _psp *pd = _dos_getpdb();
jstrcpy(tn,(char *)pd->exe_path);
}
} else jstrcpy(tn,RGBtemp);
jstrcat(tn,"$J25????.RGB");
fi=_dos_maketmp(tn,bit(5));
if ( fi<0 )
return(fi);
_dos_close(fi);
sprintf(buf,"dj -r %s %s",Afile,tn);
r=ChildDisp(buf);
if ( DrvAccess(0,tn)!=0 ){
return("ドライブが用意でいていません");
}
r=_dos_open(tn,0);
if ( r>=0 ){
fi=r;
r=RGBLoad(fi,tn);
if ( r==0 ){
_dos_close(fi);
}
}
_dos_delete(tn);
strmfe(buf,tn,"FAL");
_dos_delete(buf);
return(r);
}
/*********************************
GLM ロード
*********************************/
int GLMLoad(f)
int f;
{
int i,x,xx,y,yy,x_;
UNshort w;
UNchar *M;
UNshort buf[16000/2];
__fread(f,buf,12); // dummy 読み込み
if ( strncmp(buf,"GR65",4)!=0 ){
return("GLM ファイル じゃないようです");
}
__fread(f,&w,2);
ScanDataX=w;
__fread(f,&w,2);
ScanDataY=w;
x_=(ScanDataX+7)&0xFFF8;
if ( x_<512 )
x_=512;
if ( mat_vadds==0 ){
if ( FullColor==0 )
M=_dos_malloc(x_*ScanDataY*2);
elif ( ImageMode==0 ) // 0;カラー 1;白黒
M=_dos_malloc(x_*ScanDataY*3);
else M=_dos_malloc(x_*ScanDataY);
if ( M>=0x81000000 ){
return("メモリが足りませんでした");
}
} else {
if ( xx>mat_xwidth || yy>mat_ywidth ){
return("仮想画面SIZE OVER です。");
}
M=mat_vadds;
x_ = mat_xwidth;
FullColor=0;
}
ScanData=M;
for(y=0;y<ScanDataY;y++){
if ( FullColor==0 ){
// 64k
yy=(y)*x_*2;
__fread(f,&ScanData[yy],ScanDataX*2);
} else {
// 24bit
__fread(f,buf,ScanDataX*2);
if ( ImageMode==0 ){
// カラー
yy=y*x_*3;
for(x=0;x<ScanDataX;x++){
i=buf[x];
ScanData[yy+x*3+0]=RR(i)*8;
ScanData[yy+x*3+1]=GG(i)*8;
ScanData[yy+x*3+2]=BB(i)*8;
}
} else {
// モノクロ
yy=(y)*x_;
for(x=0;x<ScanDataX;x++){
i=buf[x];
ScanData[yy+x]=GG(i)*8;
}
}
}
}
if ( FullColor!=0 ){
if ( ImageMode==0 )
DataMd=5;
else DataMd=2;
DataC=FullColor;
}
DataX=x_;
return(0);
}
/*************************************
チャイルドサブ
**************************************/
int ChildDisp(bu)
char *bu;
{
int o,r;
o=_iocs_b_wpeek(0xE82600);
_iocs_b_wpoke(0xE82600,0x193F);
cls();
printf("\n\n\n%s\n",bu);
_iocs_tpalet(3,RGB(31,31,31));
r=CHILD(bu);
if ( r!=0 ){
printf("\n [何かキーを押して下さい]\n");
_dos_kflushio(0xFF);
_dos_inkey();
_dos_kflushio(0xFF);
RecodeModeDraw();
Rec_PosSetDraw(RecX1,RecY1,RecX2,RecY2);
}
_iocs_b_wpoke(0xE82600,o);
_dos_c_curoff();
TXCLS(0);
SetMsPat();
MsPat(-1);
return(r);
}